﻿/// <reference path="jquery.ext.js" />
/// <reference path="../plugins/jquery/jquery.js" />

/*
    列表页相关操作JS

    by sunrongzhong @ 2014.5.6
*/
!function ($) {
    "use strict";

    var jqFn = {
        /* 查询 */
        queryList: function (_config) {
            var defaultConfig = {
                useUrlParam: true,       /* 是否自动加入URl的参数 可空*/
                pageSize: 10,            /* 默认分页页数 可空 */
                pageIndex: 1,            /* 默认第一页 可空 */
                handleUrl: null,         /* Handle url 不可空 */
                listId: null,            /* 列表的ID */
                templateId: null,        /* 模板的HTMl结构的容器Id */
                pagerId: null,           /* 分页控件的Id  可空 */
                onError: null,           /* 出错  可空*/
                onLoad: null,            /* 数据加载后 参数  onload(data) 可空*/
                rowFormat: null,         /* 行格式化方法 */
                afterLoad: null,         /* 最后的回调*/
                param: {}                /* 额外的参数  !!!! Action 在此传入 !!!!!!*/
            };
            $.loading();

            var $this = $(this);
            _config = $.extend(defaultConfig, _config);
            if (!_config.handleUrl || !_config.listId) { return; }

            var param = _config.param;
            if (_config.useUrlParam) {
                param = $.extend($.urlParam(), param);
            }
            //如何没有查询条件 跳过
            param = $.extend($(this).getArea(), param);
            param.pageIndex = _config.pageIndex;
            param.pageSize = _config.pageSize;
            $.sPost(_config.handleUrl,
                param,
                function (box) {
                    if (box.list) {
                        if (_config.onLoad) { _config.onLoad(box.list); }
                        //加载表列
                        $(_config.listId).clearList().loadList(box.list, _config.templateId, _config.rowFormat);

                        if (_config.pagerId) {//分页插件的容器id
                            var options = { //分页插件配置项
                                bootstrapMajorVersion: 3,
                                currentPage: _config.pageIndex, //当前页
                                numberOfPages: 10, //总数
                                totalPages: Math.max(box.rowCount - 1, 0) / _config.pageSize + 1, //总页数
                                onPageChanged: function (event, oldPage, newPage) { //页面切换事件
                                    _config.pageIndex = newPage;
                                    $this.queryList(_config);
                                }
                            };
                            $(_config.pagerId).bootstrapPaginator(options); //分页插件初始化
                        }
                    }
                    if (_config.afterLoad) { _config.afterLoad(); }
                    $.closeLoading();
                });

        },

        /* 获取区域的控件值  callback 可空 区域里特殊处理*/
        getArea: function (callback) {
            var $this = $(this);
            var cdtData = $(this).data("SourceData") || {};
            $this.find("[data-field]").each(function () {
                var $field = $(this);
                var key = $field.data("field");
                if ($field.is(":checkbox")) {
                    cdtData[key] = $field.prop("checked");
                } else if ($field.is("span,a,label")) {
                    cdtData[key] = $field.text();
                } else {
                    cdtData[key] = $field.val();
                }
            });
            if (callback && $.isFunction(callback)) {
                callback(this, cdtData);
            }
            return cdtData;
        },
        clearArea: function (callback) {
            var $this = $(this);
            $(this).removeData("SourceData");
            $this.find("[data-field]").val("");
            $this.find("[data-field]").each(function (i, o) {
                if (!$(o).is("select") && !$(o).is("input")) {
                    $(o).text("").html("");
                }
            });
            if (callback && $.isFunction(callback)) {
                callback(this, cdtData);
            }
            return $this;
        },
        /* 区域性赋值 */
        setArea: function (data, callback) {
            var $inputs = $(this).find("[data-field]");
            $inputs.each(function () {
                var $this = $(this);
                var key = $this.data("field"),
                    skey = key.split(".");
                var val = data;
                for (var i = 0, len = skey.length; i < len; i++) {
                    if (val) {
                        val = val[skey[i]];
                    }
                }
                if (val === null || val === undefined) {
                    return;
                }
                if ($this.is(":checkbox")) {
                    $this.prop("checked", !!val);
                } else if ($this.is("span,a,label,p,strong")) {
                    $this.html(val);
                }
                else if ($this.is("li")) {
                    $this.val(val);
                }
                else {
                    $this.val(val);
                }
            });
            //callBack 补充数据方法
            if (callback && $.isFunction(callback)) {
                callback(this, data);
            }

            return $(this).data("SourceData", data);
        },
        /* 填充列表    listData 列表数据(数组), tempateId 模板的HTMl结构的容器Id, rowFormte(当前行,当前行数据源) 行特殊处理函数*/
        loadList: function (listData, tempateId, rowFormte) {
            var $this = $(this);
            var html = tempateId ? $(tempateId).find("script[type='text/template']").html() : $this.find("script[type='text/template']").html();
            if ($.isArray(listData || [])) {
                $.each(listData, function (idx, item) {
                    $this.appendListItem(item, html, rowFormte);
                });
            }
            return $this;
        },
        /* 清空table/repeater  等 */
        clearList: function () {
            var $this = $(this);
            if ($this.is("table")) {
                $this.find("tbody>tr").remove();
            } else {
                $this.find(">*:not(script)").remove();
            }
            return $this;
        },
        /* 填充列表行  listRowData 列表数据(数组), templateHtml 模板的HTMl结构 rowFormte(当前行,当前行数据源) 行特殊处理函数*/
        appendListItem: function (listRowData, templateHtml, rowFormte) {
            var $thisTbody = $(this).is("table") ? $(this).find("tbody") : $(this),
                $template = templateHtml ? $(templateHtml) : $($(this).find("script").html());
            return $template.setArea(listRowData, rowFormte).appendTo($thisTbody);
        },
        /* 获取列表值 */
        getList: function (rowFormte) {
            var items;
            if ($(this).is("table")) {
                items = $(this).find("tbody>tr");
            } else {
                items = $(this).children("*:not(script)");
            }
            return items.map(function () {
                return $(this).getArea(rowFormte);
            });
        }
    };
    jQuery.extend($.fn, jqFn);
}(jQuery);